package main

import (
	"fmt"
	"time"
)

// 向 intChan中放入1-8000个数
func putNum(intChan chan int) {
	for i := 1; i <= 150000; i++ {
		intChan <- i
	}
	// 关闭intChan
	close(intChan)
}

// 从intChan取出数据，并判断是否为素数，如果是，就放入到primeChan
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
	var flag bool
	for {
		//time.Sleep(time.Millisecond )
		num, ok := <-intChan
		if !ok {
			break
		}
		flag = true
		// 判断num是不是素数
		for i := 2; i < num; i++ {
			if num%i == 0 {
				// 说明该num不是素数
				flag = false
				break
			}
		}
		if flag {
			// 将这个数放入primeChan
			primeChan <- num
		}
	}
	fmt.Println("有一个协程因为取不到值已经退出")
	exitChan <- true
}

func main() {
	start := time.Now().Unix()

	intChan := make(chan int, 10000)
	primeChan := make(chan int, 500000) //放入结果
	// 标识退出的管道
	exitChan := make(chan bool, 10)

	go putNum(intChan)
	// 开启四个协程
	for i := 0; i < 4; i++ {
		go primeNum(intChan, primeChan, exitChan)
	}
	// 主线程进行阻塞处理
	go func() {
		for i := 0; i < 4; i++ {
			<-exitChan
		}
		end := time.Now().Unix()
		println("所耗时间为：", end-start)
		// 当我们成功从exitChan中取出四个结果，就可以关闭primeChan管道
		close(primeChan)
	}()

	//遍历primeNum ，取出结果
	count := 0
	for {
		_, ok := <-primeChan
		if !ok {
			break
		}
		count++
		//fmt.Println(res)
	}
	println("main主线程退出,结果数量为：", count)

}
